package main

import "fmt"

/*
学习指针
*/

func main() {

	/*
		学习指针
	*/
	zhizhen()

	/*
		值类型和引用类型
	*/
	test()

	/*
		标识符的命名规范

		凡是自己可以起名字的地方都叫标志符
	*/

}

/*
指针
*/
func zhizhen() {
	// 基本数据类型在内存的布局
	var i int = 10
	// i的地址是什么？
	fmt.Println("i的地址为：", &i)

	// 指针变量存的是一个地址 这个地址指向的空间存的才是值
	var ptr *int = &i
	// 1、ptr 是一个指针变量
	// 2、ptr 的类型为 *int
	// 3、ptr 本身的值为 &i
	fmt.Printf("ptr=%v\n ", ptr)
	fmt.Println("ptr 的地址为", &ptr)
	// 获取指针类型所指的值
	fmt.Println("ptr 指向的值=%v", *ptr)

	// 通过指针地址直接修改值
	var a int = 300
	var pat *int = &a
	*pat = 301
	fmt.Println("pat = ", a)

	// 指针的注意细节  *数据类型  *int  *float32
	// 值类型包括：  额外  数组和结构体 struct

}

/*
值类型和引用类型
*/
func test() {
	// 值类型 int float bool string 数组 struct
	// 变量直接存储值，内存在栈中分配

	// 引用类型 指针 切片slice map
	// 变量存储地址，内存在堆中存储，当没有引用时，就会被 gc 回收

}
